04

您所在的位置:网站首页 hive isnotnull 04

04

#04| 来源: 网络整理| 查看: 265

目  录

1 组件简介

1.1 组件概述

1.1.1 组件特点

1.1.2 应用场景

1.1.3 使用限制

1.2 组件架构

2 快速入门

2.1 组件安装

2.1.1 查看组件的日志信息

2.2 运行状态监控

2.3 快速使用指导

2.3.1 Impala负载均衡

2.3.2 Impala-shell

2.4 快速链接

3 使用指南

3.1 Impala集群扩容

3.1.1 使用场景

3.1.2 扩容前准备

3.1.3 扩容约束

3.1.4 扩容影响

3.1.5 扩容操作指导

3.1.6 扩容验证

3.2 Impala集群缩容

3.2.1 使用场景

3.2.2 缩容前准备

3.2.3 缩容约束

3.2.4 缩容影响

3.2.5 缩容操作指导

3.2.6 缩容验证

3.3 权限访问控制

3.3.1 权限操作示例

3.4 SQL操作

3.4.1 创建表

3.4.2 修改表信息

3.4.3 数据加载

3.4.4 数据查询

3.4.5 视图操作

3.4.6 函数介绍

3.4.7 Impala SQL特有语法

3.4.8 数据类型说明

3.5 Impala其他连接方式

3.5.1 JDBC方式

3.5.2 数据工厂访问Impala

3.6 分区表

3.6.1 分区技术适用场合

3.6.2 分区表相关SQL语句

3.6.3 分区修剪

3.6.4 分区键列

3.6.5 使用不同的文件格式

4 最佳实践

4.1 Impala应用实例

4.1.1 设计原则

4.2 Impala性能优化

4.2.1 最佳实践

4.2.2 连接查询优化

4.2.3 使用统计信息

4.2.4 使用EXPLAIN信息

4.2.5 使用PROFILE信息

5 常见问题解答

5.1 运维类问题

1 组件简介 1.1  组件概述

Impala是一款基于Hadoop的大数据实时查询分析工具,其内部执行引擎采用MPP架构实现,相比Hive把任务转换成MapReduce或Tez的离线计算方式,Impala不需要对中间计算结果进行耗时的排序和shuffle计算,完全采用内存进行计算,相比Hive性能提升10~50倍。

Impala与Hive使用相同的元数据,并兼容几乎所有Hive SQL语法,可直接读取存储在Hive数据仓库中的表数据,并可以利用Hive的JDBC/ODBC接口进行访问,快速与已有Hive数据仓库形成统一的批处理分析和交互式分析的解决方案。

说明

Impala更多作为大数据查询分析工具的补充,并不会替代Hive或Spark的批处理框架。Impala在数据仓库中通常作为数据集市层,根据上层业务需求交互式获取结果数据,数据ETL处理和复杂计算仍由Hive或Spark完成。

 

1.1.1  组件特点

Impala具有以下特点:

·     查询速度快:合理使用情况下,查询分析性能为秒级别。

·     兼容度高:能直接访问存储在HDFS、Hive或HBase中的数据,无需将数据重新处理到特有的存储系统中。

·     使用简单:通过已有的Hive JDBC、WebUI等工具直接使用Hive SQL语句进行分析。

·     可伸缩性:Impala计算依赖impalad进程,可以方便的进行动态扩展,增强计算能力。

1.1.2  应用场景

Impala常用于以下场景:

·     BI报表,支持与Tableau、FineBI等BI工具集成使用。

·     Ad-hoc数据分析查询。

1.1.3  使用限制

Impala在使用时具有高性能、低延迟、兼容性好等优势,同时也具有以下限制,使用时请务必注意:

·     Impala比较依赖内存资源,使用时内存不建议低于16G。

·     支持ORC、Parquet文件格式。Impala3.4.0支持ORC格式的数据查询和表创建,ORC格式数据插入还需通过Hive实现。

·     能够使用Hive的UDF和UDAF函数,不能使用UDTF。

·     分区数不宜过多,超过1w时会影响性能,需要定期删除无用分区。

·     通过Hive建表元数据不会自动同步到Impala,需要手动执行Invalidate metadata命令进行同步。

1.2  组件架构

图1-1 Impala整体架构

 

表1-1 模块说明

模块名称

说明

StateStore

·     负责收集分布在集群中各个Impalad进程的资源信息、各节点的健康状况,同步节点信息

·     负责query的调度

Catalog

·     从Hive MetaStore中同步表的元数据信息,并分发到各impalad进程中

·     接收来自StateStore的所有请求

Impalad

·     计算节点,一般与DataNode部署在一起,以利用数据本地性计算优势

·     每个Impalad进程分为Query Planner、Query Coordinator和Query Exec Engine三部分

·     接收client、jdbc或odbc请求,通过Planner完成SQL解析生成执行计划, 并作为Query协调节点,下发执行计划中的计划片段给所有Impalad上的Executor执行,查询结果返回给协调节点进行聚合

 

Impala Daemon是运行在集群每个节点上的守护进程,是impala的核心组件。在每个节点上这个进程的名称为impalad。它负责读写数据文件,接受来自impala-shell、Hue、JDBC或ODBC的查询请求,与集群中的其他节点分布式并行工作,并将本节点的查询结果返回给中心协调者节点。

为了解其他节点的健康状况和负载,impalad进程会一直与statestore保持通信。当impala集群中创建、修改或者删除了对象或者进行了insert/load data操作,catalogd进程要向所有节点广播消息,以保证每个impalad节点能够及时地了解整个集群中对象元数据的最新状态。

2 快速入门 2.1  组件安装

说明

·     在Hadoop集群中,安装Impala时的注意事项和操作指导以及部署过程中相关的参数说明等,详情请参见产品安装部署手册和在线联机帮助。

·     安装Impala之前,需要安装HDFS、MapReduce2、YARN、Zookeeper、Hive。

 

2.1.1  查看组件的日志信息

表2-1 组件日志路径说明

组件

日志路径

Impala

/var/de_log/impala

 

2.2  运行状态监控 1. 查看组件详情

说明

Impala Daemon是运行在集群每个节点上的守护进程,是Impala的核心组件,在每个节点上Impala Daemon进程的名称为impalad。

 

进入Impala组件详情页面,如图2-1所示。组件详情页面主要展示组件的部署拓扑、配置详情和配置修改历史等相关信息,同时可对组件或组件进程执行相关管理操作,可查看或修改组件的各配置项信息,也可查看组件的配置修改历史及当前使用配置版本。

主要功能如下:

·     部署拓扑:在组件详情的[部署拓扑]页签,可查看组件进程的安装详情以及运行状态详情,并可对组件执行停止、重启、删除等相关操作。

【说明】:同一个进程可分别安装在多个主机节点上,所以进程列表中某一进程名可能重复出现,但同一进程名对应的主机名和主机IP不同。

·     配置:在组件详情的[配置]页签,可查看或修改组件各配置项的信息。

·     配置修改历史:在组件详情的[配置修改历史]页签,可查询组件的配置历史版本以及当前使用版本。

·     组件操作:在组件详情页面右上角,可对组件执行相关管理操作。比如:重启组件、添加进程、访问快速链接、查看操作记录等。

图2-1 组件详情

 

2. 组件检查

集群在使用过程中,根据实际需要,可对Impala执行组件检查的操作。

(1)     组件检查的方式有以下三种,任选其一即可:

¡     在[集群管理/集群列表]页面,单击某集群名称可跳转至对应的集群详情页面。

-     在集群详情页面选择[组件]页签,单击业务组件列表中Impala组件对应的按钮。

-     在集群详情页面选择[组件]页签,单击业务组件列表中Impala组件名称进入组件详情页面,在右上角组件操作的下拉框中选择按钮。

¡     在组件管理的组件详情页面右上角组件操作的下拉框中选择按钮。

(2)     然后在弹窗中进行确定后,即可对该组件进行检查。

(3)     组件检查结束后,检查窗中会显示组件检查成功或失败的状态,如图2-2所示,表示该组件检查成功,可正常使用。

图2-2 组件检查

 

(4)     组件检查结束后,在组件详情页面单击按钮,进入操作记录窗口。可查看“Impala Service Check”组件操作执行的详细信息以及操作日志详情,根据操作日志可判断组件检查的具体情况。

图2-3 组件检查日志详情

 

2.3  快速使用指导

注意

根据大数据集群是否开启Kerberos认证,用户访问Impala时的认证方式不同,详情请参见本章节内容。

 

Impala既可以通过集群用户访问,又可以通过组件超级用户访问。其中:

·     集群用户:指在大数据集群的[集群权限/用户管理]页面可查看到的用户,包括集群超级用户和集群普通用户。其中:

¡     集群超级用户:仅Hadoop集群拥有集群超级用户。新建Hadoop集群成功后,集群超级用户会自动同步到[集群权限/用户管理]页面,且对应描述为“集群超级用户”。

¡     集群普通用户:指在[集群权限/用户管理]页面新建的用户。开启权限管理后,普通用户绑定角色后即可拥有该角色所具有的权限;不开权限管理时,普通用户缺省仅拥有各组件原生的用户权限。

·     组件超级用户:指组件内部的最高权限用户,如Impala组件的Impala用户。大数据集群中安装组件时均会缺省创建组件内置超级用户,也是集群用户的一种。

2.3.1  Impala负载均衡

Impala支持负载均衡,不开启kerberos的集群默认开启负载均衡;开启kerberos的集群默认关闭负载均衡,需要通过修改配置项impala_ha_enabled为true才能生效。默认使用haproxy作为代理服务器对impalad节点进行负载均衡,对应配置文件/etc/haproxy/haproxy.cfg。

使用负载均衡代理服务有以下优点:

·     应用程序连接到安装负载均衡的主机上,而不是连接具体某个impalad进程运行的主机。如果任何一个运行impalad进程的主机不可用,则应用程序连接请求仍然会成功,因为应用程序始终连接的是代理服务器,而不是连接到运行Impalad进程的特定主机。

·     每个impala查询的协调器节点可能需要较多的内存和cpu。代理服务器可以发送查询,以便每个连接使用不同的协调器节点。这种负载均衡技术使Impalad节点共享这个额外的工作,而不是将其集中在单个节点上。

2.3.2  Impala-shell

在安装Impala的节点上输入impala-shell命令进入到交互式命令行界面,也支持在impala shell后指定参数,如$ impala-shell -h,这样就可以查看使用帮助,再例如显示一个SQL语句的执行计划:$ impala-shell -p select count(*) from t_stu。

下面是Impala的外部Shell的一些参数:

·     -h (--help) 帮助

·     -v (--version) 查询版本信息

·     -V (--verbose) 启用详细输出

·     --quiet 关闭详细输出

·     -p 显示执行计划

·     -i hostname (--impalad=hostname) 指定连接主机格式hostname:port 默认端口21000

·     -r(--refresh_after_connect)刷新所有元数据

·     -q query (--query=query) 从命令行执行查询,不进入impala-shell

·     -d default_db (--database=default_db) 指定数据库

·     -B(--delimited)去格式化输出  

·     --output_delimiter=character 指定分隔符

·     --print_header 打印列名

·     -f query_file(--query_file=query_file)执行查询文件,以分号分隔

·     -o filename (--output_file filename) 结果输出到指定文件

·     -c 查询执行失败时继续执行

·     -k (--kerberos) 使用kerberos安全加密方式运行impala-shell

·     -l 启用LDAP认证

·     -u 启用LDAP时,指定用户名

·     -b load-balancer-hostname 开启负载均衡后使用该参数,指定负载均衡节点hostname

1. 非kerberos环境对Impala执行操作示例

说明

非Kerberos环境下,不需要用户做身份认证即可直接对Impala执行管理操作。

 

Impala安装完成后,连接集群内的节点(该节点要求安装了Impala Daemon,即impalad进程)即可操作Impala。操作步骤如下:

(1)     直接使用impala-shell命令进入即可,默认连接本机impalad,如图2-4所示。

图2-4 非kerberos环境连接本机impalad

 

(2)     非kerberos环境默认开启负载均衡,也可使用以下两种方式进入:

¡     方式一:impala-shell命令添加-i参数,可指定连接任何一个impalad节点,示例为diao177.hde.com,如图2-5所示。

图2-5 非kerberos环境连接指定的impalad节点

 

¡     方式二:impala-shell命令添加-i参数,并指定连接负载均衡节点及监听端口,如图2-6所示,从配置文件impala-haproxy中可查看到默认端口为25003。此方式只需要连接到负载均衡节点:

-     若开启HA,即连接虚IP对应的域名

-     若不开启HA,即连接master节点对应的域名

不指定连接哪个impalad节点,只要有一个impalad节点可用,请求就会成功。

图2-6 非kerberos环境连接负载均衡节点

 

2. Kerberos环境对Impala执行操作示例

说明

Kerberos环境下,若想访问Impala并对Impala执行管理操作,则必须首先进行用户身份认证,认证方式请参见2.3.2  3. Kerberos环境下的用户身份认证。

 

(1)     默认不开启负载均衡时

需要先对用户进行认证,详情请参见2.3.2  3. Kerberos环境下的用户身份认证。然后使用impala-shell -k 进入即可,如图2-7所示。

图2-7 Kerberos环境下连接本机impalad

 

(2)     开启负载均衡时

需要先对用户进行认证,详情请参见2.3.2  3. Kerberos环境下的用户身份认证。然后可使用以下两种方式进入:

¡     方式一:-i 可指定连接任何一个impalad节点,示例为noder191.hde.com;-b 指定连接负载均衡节点,如图2-8所示,本集群haproxy安装节点为:

-     若开启HA,安装节点即虚IP对应的域名

-     不开启HA,安装节点即master节点对应的域名

图2-8 Kerberos环境连接指定的impalad节点

 

¡     方式二:-i 指定连接负载均衡节点及监听端口,从配置impala-haproxy中可查看到默认端口为25003。此方式只需要连接到负载均衡节点,不指定连接哪个impalad节点,只要有一个impalad节点可用,请求就会成功,如图2-9所示。

图2-9 Kerberos环境连接负载均衡节点

 

3. Kerberos环境下的用户身份认证

注意

Kerberos环境下,若想访问Impala并对Impala执行管理操作,则必须首先进行用户身份认证。非Kerberos环境下,不需要用户做身份认证即可直接对Impala执行管理操作,可跳过此步骤。

 

Kerberos环境下进行用户身份认证的方式有两种(根据实际情况任选其一即可):

·     集群用户身份认证

·     组件超级用户身份认证

(一)集群用户身份认证

说明

·     集群用户指在大数据集群的[集群权限/用户管理]页面可查看到的用户,包括集群超级用户和集群普通用户。

·     集群用户的认证文件可在[集群权限/用户管理]页面,单击用户列表中用户对应的按钮进行下载。

 

Impala还可以通过集群用户访问。在开启Kerberos的大数据集群中进行集群用户(以user1用户示例)身份认证的方式,包括以下两种(根据实际情况任选其一即可):

·     方式一(此方式不要求知道用户密码,直接使用keytab文件进行认证)

a.     将用户user1的认证文件(即keytab配置包)解压后,上传至访问节点的/etc/security/keytabs/目录下,然后将keytab文件的所有者修改为user1,命令如下:

chown user1 /etc/security/keytabs/user1.keytab

b.     使用klist命令查看user1.keytab的principal名称,命令如下:

klist -k user1.keytab

【说明】如图2-10所示,红框内容即为user1.keytab的principal名称。

图2-10 认证文件的principal名称

 

c.     切换至用户user1,并执行身份验证的命令如下:

su user1

kinit -kt user1.keytab [email protected]

【说明】其中:user1.keytab为用户user1的keytab文件,[email protected]为user1.keytab的principal名称。

d.     输入klist命令可查看认证结果。

·     方式二(此方式要求用户密码已知,通过密码直接进行认证)

a.     切换至用户user1进行认证,输入以下命令:

su user1

kinit user1

b.     根据提示输入密码Password for [email protected]

c.     输入klist命令可查看认证结果。

图2-11 查看认证结果

 

(二)组件超级用户身份认证

Impala可以通过组件超级用户访问,比如Impala用户。在开启Kerberos的大数据集群中进行组件超级用户(以Impala用户示例)认证的步骤如下:

(1)     在集群内安装Impala Daemon节点的/etc/security/keytabs/目录下,查找Impala的认证文件“Impala.service.keytab”。

(2)     使用klist命令查看impala.service.keytab的principal名称,命令如下:

klist -k impala.service.keytab

【说明】如图2-12所示,红框内容即为impala.service.keytab的principal名称。

图2-12 认证文件的principal名称

 

 

(3)     切换至用户impala,并执行身份验证,命令如下:

su impala

kinit -kt impala.service.keytab impala/[email protected]

【说明】其中:impala.service.keytab为impala的认证文件,impala/[email protected]为impala.service.keytab的principal名称。

(4)     输入klist命令可查看认证结果。

2.4  快速链接 1. 配置组件快速链接

大数据集群部署完成后,需要修改本地hosts文件,用以确保组件的快速链接页面通过域名访问能够顺利跳转。

修改本地hosts文件的方法如下:

(1)     登录大数据集群中任意一节点,查看当前集群的hosts文件(Linux环境下位置为/etc/hosts)。

(2)     将集群的hosts文件信息添加到本地hosts文件中。若本地电脑是Windows环境,则hosts文件位于C:\Windows\System32\drivers\etc\hosts,修改该hosts文件并保存。

(3)     在本地hosts文件中配置主机域名信息完成后,此时即可访问组件的快速链接。

2. 访问Impala快速链接

Impala提供了界面页面,支持查看Impala的版本信息、进程启动时间、硬件信息、操作系统信息、进程信息以及控制组信息。

(1)     如图2-13所示,在Impala组件详情页面的右上角[快速链接]的下拉框中,可以获取Impala的访问入口信息。

图2-13 Impala快速链接

 

(2)     根据集群是否开启Kerberos,访问Impala快速链接分为两种情况:

¡     若集群没有开启Kerberos认证,则此时点击访问入口链接,可直接跳转访问对应的UI页面。

¡     若集群开启了Kerberos认证,则此时点击访问入口链接,需要输入用户名和密码进行认证(可以使用集群创建时填写的超级用户,也可以使用用户管理中创建的用户),然后才可跳转访问对应的UI页面。

(3)     在Impala管理页面,如图2-14所示,默认主页显示的是Impala当前版本信息、进程启动时间、硬件信息、操作系统信息、进程信息以及控制组信息。

图2-14 Impalad UI页面

 

3 使用指南 3.1  Impala集群扩容

Impala集群扩容是指在某节点上新增安装Impala Daemon。

3.1.1  使用场景

随着业务量的增加,集群服务能力无法满足用户实际使用需求时,需要考虑对Impala集群进行扩容。当Impala集群出现以下情况时,可以考虑扩容:

·     总缓存大于资源池配给。

·     中间文件配给的路径scratch_dirs总和不足。

·     内存使用率超过80%。

·     tcp连接数超过16k。

·     线程数超过32k。

·     并发数超过节点核数。

·     查询经优化分析后时间不理想。

3.1.2  扩容前准备 1. 扩容规划

(1)     进行扩容分析,确定扩容场景。

(2)     在集群节点上新增安装Impala Daemon:

¡     如果集群中有节点没有安装Impala Daemon,直接在集群节点中添加Impala Daemon进程。

¡     如果集群中所有节点均已安装Impala Daemon,进行Impala Daemon扩容前则需要先添加主机。

2. 环境检查

(1)     登录大数据平台管理系统,查看查看Impala组件的状态是否正常。。

(2)     进入Impala组件详情页,查看Impala的部署拓扑,确保集群中每个服务的状态正常,Impala Daemon、Impala Catalog Service、Impala State Store均处于“已启动”状态。

3.1.3  扩容约束

·     扩容节点操作系统版本与集群内部版本需保持一致。

·     扩容操作一旦开始,不支持中止。

·     扩容节点内存和挂盘与原节点一致。

3.1.4  扩容影响

·     一旦扩容失败,需要及时将扩容失败的节点剔除。

·     扩容成功后,Impala集群的查询并发性会得到增强。

·     扩容后需要重启impala,考虑业务中断。

3.1.5  扩容操作指导

注意

若集群中所有节点均已安装Impala Daemon,进行Impala Daemon扩容前则需要先添加主机,然后再进行Impala Daemon扩容。如果集群中有扩容所用主机,则可直接跳过该步骤。关于添加主机的操作指导,详情请参见产品在线联机帮助。

 

扩容操作步骤如下:

(1)     在Impala组件详情页面,在右上角组件操作的下拉框中选择按钮。

(2)     弹出添加进程窗口,如图3-1所示。

a.     选择进程及主机。

在选择进程项的下拉列表中选择可添加的组件进程,在选择主机项的主机列表中勾选进程安装在哪一个主机上(支持多选)。如果页面显示“当前无可用DataNode节点用于部署该进程”,则需要进行集群扩容增加可用主机。

b.     部署进程。

选择结束后单击下一步部署进程,直至部署进度条结束(部署过程中不支持中止)。

c.     启动进程。

部署进程结束后单击下一步启动进程,直至启动进度条结束(启动过程中不支持中止)。

图3-1 添加进程

 

(3)     查看进程变化

Impala Daemon扩容完成后,在组件详情页面“部署拓扑”页签下可以看到Impala Daemon安装数量变化以及状态。

(4)     重启组件(根据实际情况选择)

进入集群详情页面,选择“组件”页签,需根据页面提示重新启动相关组件。

3.1.6  扩容验证

(1)     登录大数据平台管理系统。

(2)     执行Impala组件检查,确保Impala组件可正常使用,详情请参考2.2  2. 组件检查。

(3)     查看Impala组件部署拓扑,可看到已有新增的扩容节点。

(4)     打开Impala快速链接,在Impala UI首页查看Impala Daemon的信息。

3.2  Impala集群缩容

Impala集群缩容是指将Impala Daemon进行删除,用户可通过执行删除进程操作删除Impala Daemon,也可通过执行删除主机操作删除Impala Daemon所在的主机节点。

说明

本章节以执行删除进程操作删除Impala Daemon为例进行说明。

 

3.2.1  使用场景

Impala集群缩容的场景主要有:

·     初始Impala Daemon节点规划不合理。

·     资源过剩,闲置时占用系统资源。

·     当Impala Daemon缩容后,也要能满足客户业务需求,所以具体缩容量以客户需求规划为主。

3.2.2  缩容前准备 1. 缩容规划

·     确定缩容后资源满足需求。

·     确定能接受服务重启。

·     如果被缩节点是业务url指定节点,需确认可以更改url。

2. 环境检查

(1)     登录大数据平台管理系统,查看查看Hive组件的状态是否正常。

(2)     进入Impala组件详情页,查看Impala的部署拓扑,确保集群中每个服务的状态正常,Impala Daemon、Impala Catalog Service、Impala State Store均处于“已启动”状态。

3.2.3  缩容约束

·     缩容操作一旦开始,不支持中止。

·     缩容前,请检查Impala Daemon是否有运行的任务,如果有运行的任务时,缩容时会影响任务执行。

·     若集群中当前仅安装了3个Impala Daemon,删除时会报错:删除进程There is only 3 IMPALA_DAEMON,不允许缩容。

3.2.4  缩容影响

·     缩容后需要重启服务。

·     缩容节点如果是业务jdbc的url指定节点,需要更改。

3.2.5  缩容操作指导

说明

Impala Daemon缩容操作不仅可以在组件详情页面的[部署拓扑]页签下执行,也可以在[集群管理/主机管理/主机监控]下的主机详情页面执行。本章节仅以“在组件详情页面的[部署拓扑]页签下执行Impala Daemon缩容操作”为例进行说明,在主机详情页面执行Impala Daemon缩容操作,与其类似不再进行说明。

 

缩容操作步骤如下:

(1)     在Impala组件详情页面,选择缩容节点。

(2)     在组件详情页面的[部署拓扑]页签下,可查看已安装的Impala Daemon,根据主机IP选择需要缩容的节点,单击操作列的按钮,停止Impala Daemon。

(3)     删除Impala daemon

待Impala Daemon停止成功后,如图3-2所示,单击操作列的按钮,即可完成Impala Daemon缩容。

图3-2 删除进程

 

(4)     查看进程变化

Impala Daemon缩容完成后,刷新页面从基本信息可以看到Impala Daemon数量变化情况以及状态。

(5)     重启组件(根据实际情况选择)

进入集群详情页面,选择[组件]页签,需根据页面提示重新启动相关组件。

3.2.6  缩容验证

(1)     登录大数据平台管理系统。

(2)     执行Impala组件检查,确保Impala组件可正常使用,详情请参考2.2  2. 组件检查。

(3)     查看Impala组件部署拓扑,可看到相关缩容节点已经删除。

(4)     打开Impala快速链接,在Impala UI首页查看Impala Daemon的信息。

3.3  权限访问控制

注意

集群新建用户的组件权限会因为集群是否开启权限管理功能而有所不同:

·     未开启权限管理时,用户可进行库表的创建、修改、插入、删除等操作。

·     开启权限管理后,组件权限需通过[集群权限/角色管理]中的角色分配给用户,用户通过绑定角色进行赋权后,才能对组件执行操作。

 

权限管理是安全管理的重要组成部分,在开启权限管理的集群中,权限基于角色进行统一管理,角色是权限的集合。

为用户赋予权限的整体流程如下:

(1)     新建角色,并为角色配置权限。

(2)     新建用户,并将角色分配用户,用户即拥有角色所具有的权限。

Impala支持对数据库表配置权限,数据库表可对数据库、数据表、列配置权限,权限包括:select、create、drop、alter、update,其中all表示配置所有权限,默认所有用户均可以使用refresh,invalidate metadata同步权限与库表数据。Impala操作所需权限对应关系如表3-1所示。

表3-1 权限列表

权限类型

对应的组件常用操作

select

库表查询等相关操作

update

插入库表等相关操作

create

创建库表等相关操作

drop

删除库表等相关操作

alter

修改库表等相关操作

refresh/ invalidate metadata

权限与库表同步操作

all

支持以上所有操作

 

3.3.1  权限操作示例

注意

Impala使用Hive数据库表的权限管理模块,有如下使用限制:

·     不支持Hive数据库UDF权限,不支持index权限。

·     支持Hive数据库表权限:select、create、drop、alter、update、all。

·     当把Hive的update权限赋予给Impala的角色时,实际获取到的为insert权限(即插入权限),Impala当前不支持update权限(即更新权限)。

·     当前版本中,Impala仅支持查询操作的列权限。

 

1. 数据库权限控制

表3-2 授权配置

操作

权限要求(数据库示例为impalatest)

create

数据库:impalatest,数据表:*,列:*,权限:create

drop

数据库:impalatest,数据表:*,列:*,权限:drop

select

数据库:impalatest,数据表:*,列:*,权限:select

alter

数据库:impalatest,数据表:*,列:*,权限:alter

all

数据库:impalatest,数据表:*,列:*,权限:all

 

以授予create权限为例,对数据库impalatest授予create权限(其它权限的授予方式与create方式操作类似),操作步骤如下:

(1)     新建用户usertest01,授权前执行创建库操作。如图3-3所示,表示用户usertest01没有数据库impalatest的create权限。

图3-3 创建失败

 

(2)     新建角色授权

在[集群权限/角色管理]页面,新建角色impalarole,本示例授予该角色拥有数据库impalatest的create权限。

图3-4 新建角色

 

 

(3)     用户授权

在[集群权限/用户管理]页面页面,在用户usertest01的操作列,单击按钮,选择角色impalarole。

图3-5 用户绑定角色

 

(4)     重新执行创建数据库操作,创建成功。

图3-6 创建成功

 

2. 表权限控制

注意

·     当把Hive的update权限赋予给Impala的角色时,实际获取到的为insert权限(插入权限),Impala当前不支持update权限(更新权限)。

·     Impala使用alter修改表名时需要拥有all权限。

 

表3-2 授权配置

操作

权限要求(数据库示例为impalatest,表示例为tabletest)

create table

数据库:*或impalatest,数据表:*或tabletest,列:*,权限:create

alter table

数据库:*或impalatest,数据表:*或tabletest,列:*,权限:alter

insert into table

数据库:*或impalatest,数据表:*或tabletest,列:*,权限:update

select * from table

数据库:*或impalatest,数据表:*或tabletest,列:*或c1,权限:select

drop table

数据库:*或impalatest,数据表:*或tabletest,列:*,权限:drop

 

以授予select权限为例,对数据库impalatest数据表tabletest授予select权限,操作步骤如下:

(1)     通过用户usertest01执行select操作。如图3-7所示,表示用户usertest01没有数据表tabletest的select权限。

图3-7 查询失败

 

(2)     编辑角色授权

在[集群权限/角色管理]页面,编辑角色impalarole,本示例授予该角色拥有数据库impalatest数据表tabletest的select权限。

图3-8 编辑角色授予

 

 

(3)     用户权限变更

在[集群权限/用户管理]页面,用户usertest01已绑定角色impalarole,所以角色impalarole的权限变更时,用户usertest01的权限自动同步变更。

(4)     重新执行查询表操作,查询成功。

图3-9 查询成功

 

3. 列权限控制

表3-3 授权配置

操作

权限要求(数据库示例为impalatest,表示例为tabletest,列示例为c1)

select c1 from table

数据库:*或impalatest,数据表:*或tabletest,列:c1,权限:select

 

授予select权限为例,对数据库impalatest数据表tabletest的c1列授予select权限,操作步骤如下:

(1)     通过用户usertest01执行select操作。如图3-10所示,表示用户usertest01没有数据表tabletest的列c1的select权限。

图3-10 查询失败

 

(2)     编辑角色授权

在[集群权限/角色管理]页面,编辑角色impalarole,本示例授予该角色拥有数据库impalatest数据表tabletest的列c1的select权限。

图3-11 编辑角色授予

 

 

(3)     用户权限变更

在[集群权限/用户管理]页面,用户usertest01已绑定角色impalarole,所以角色impalarole的权限变更时,用户usertest01的权限自动同步变更。

(4)     重新执行查询表中列c1的操作,查询成功。

图3-12 查询成功

 

4. 对表进行load操作

注意

·     对表执行load操作时,不仅需要表的insert权限,还需要手动执行setfacl命令为impala用户赋予路径的所有权限。

·     当把Hive的update权限赋予给Impala的角色时,实际获取到的为insert权限(即插入权限),Impala当前不支持update权限(即更新权限)。

 

集群开启权限管理时,在Impala中对表执行load操作前,需要对impala用户赋予路径的所有权限,需执行如下命令:

hadoop fs -setfacl -R -m user:impala:rwx

【操作示例】

(1)     使用hdfs或集群超级用户上传文件,并为impala用户赋予文件路径所有权限,命令如下:

hadoop fs -rmr /d1;hadoop fs -mkdir -p /d1/d2;hadoop fs -put /tmp/data.txt  /d1/d2/; hadoop fs -setfacl -R -m user:impala:rwx /d1

图3-13 执行结果

 

(2)     新建用户adiao1,授权前执行load操作。如图3-14所示,表示用户adiao1没有数据表的insert权限。

图3-14 执行load失败

 

(3)     新建角色授权

在[集群权限/角色管理]页面,新建角色role1,本示例授予该角色拥有数据表的update权限。然后给用户adiao添加该角色授权:

图3-15 新建角色

 

(4)     用户授权

在[集群权限/用户管理]页面页面,在用户adiao1的操作列,单击按钮,选择角色role1。

(5)     重新执行load操作,执行成功。

图3-16 执行load成功

 

3.4  SQL操作

Impala SQL支持大多数的HiveQL的语句和语法,支持与Hive数据类型完全相同名称和语义的数据类型,大多数的HiveQL的SELECT和INSERT语句可以不做修改在Impala上直接运行。

3.4.1  创建表 1. 概述

语法说明:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name  

  [(col_name data_type [column_constraint_specification] [COMMENT col_comment]

[, ……])]

 

  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

  [SORTED BY (col_name [ASC|DESC], ...)]

  [COMMENT table_comment]

  [ROW FORMAT row_format]

[WITH SERDEPROPERTIES (‘key1’=’value1’,…)]

  [STORED AS file_format]

  [LOCATION hdfs_path]

  [CACHED IN ‘pool_name’ [WITH REPLICATION = integer] | UNCACHED]

  [TBLPROPERTIES (property_name=property_value, ...)]

[[AS select_statement]|[LIKE table_name]]

创建表主要有以下三种方式:

·     自定义表结构,以关键字EXTERNAL来区分创建内部表或外部表。

¡     内部表:如果对数据的处理都由Impala完成,则应该使用内部表。在删除内部表时,元数据和数据一起被删除。

¡     外部表:如果数据要被多种工具(如Pig等)共同处理,则应该使用外部表,可避免对该数据的误操作。删除外部表时,只删除掉元数据。

·     根据已有表来创建新表,使用CREATE LIKE句式,可以完全复制原有的表结构,包括表的存储格式。

·     根据查询结果创建新表,使用CREATE AS SELECT句式。

Impala仅支持依赖文件类型:

·     PARQUET(推荐使用)

·     TEXTFILE

·     AVRO

·     SEQUENCEFILE

·     RCFILE

2. 数据类型

Impala中的数据类型包括基本数据类型和复杂数据类型。

表3-4 基本数据类型

数据类型

描述

示例

TINYINT

1byte有符号整数

100Y

SMALLINT

2byte有符号整数

100S

INT

4byte有符号整数

100

BIGINT

8byte有符号整数

100L

FLOAT

4byte单精度浮点数

3.14F

DOUBLE

8byte双精度浮点数

3.14D

DECIMAL

允许用户自定义规模和精度,比DOUBLE表示的范围大、更精确

3.14BD

TIMESTAMP

整数(距离UNIX新纪元时间的秒数)、浮点数(距离UNIX新纪元时间的秒数,精确到纳秒)或字符串(JDBC约定的时间字符串格式:YYYY-­MM-­DD hh:mm:ss:fffffffff)

-

STRING

字符串,可使用单引号或双引号

-

VARCHAR

指定长度的字符串

-

CHAR

指定长度,长度不够会以空格填充

-

BOOLEAN

布尔类型,true或false

-

 

表3-5 复杂数据类型

数据类型

描述

示例

STRUCT

类似于C中的struct,可用“点”符号访问元素

STRUCT

MAP

一组键值对集合,用map[key]访问元素

MAP

ARRAY

数组,用编号访问,编号从0开始

ARRAY

 

对比Hive数据类型,Impala不支持DATE、BINARY以及复杂类型UNION。

3. 创建表示例

(1)     内部表创建,执行如下命令:

create table employees(name string, salary float, address string) row format delimited fields terminated by ',' stored as textfile;

其中:

¡      "delimited fields terminated by"用于指定列与列之间的分隔符

¡     “stored as textfile”用于指定表的存储格式为textfile

(2)     外部表创建,执行如下命令:

create external table stocks(sysbol string, price_open float, price_colse float ) ;

(3)     使用CREATE Like创建表,执行如下命令:

create table employees_like LIKE employees;

4. 扩展

·     创建分区表

一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。对分区内数据进行查询,可缩小查询范围,加快数据的检索速度和可对数据按照一定的条件进行管理。

分区可在创建表时用PARTITIONED BY子句进行定义。

CREATE EXTERNAL TABLE IF NOT EXISTS employees_info_extended

 (

 id INT,

 name STRING,

 usd_flag STRING,

 salary DOUBLE,

 deductions MAP,

 address STRING

 )  PARTITIONED BY (entrytime STRING) 

 STORED AS TEXTFILE;    

·     更新表的结构

一个表在创建完成后,还可以使用ALTER TABLE执行增/删字段、修改表属性以及添加分区等操作。例如为表employees_info_extended增加tel_phone和email字段。执行如下命令:

 ALTER TABLE employees_info_extended ADD COLUMNS (tel_phone STRING, email STRING);    

3.4.2  修改表信息 1. 修改表名

ALTER TABLE name RENAME TO new_name

2. 增加列

ALTER TABLE name ADD COLUMN colname type或ALTER TABLE name ADD COLUMNS (colname type[, …])

3. 修改列

ALTER TABLE name CHANGE colname new_colname type

4. 删除列

ALTER TABLE name DROP colname

5. 增加分区

ALTER TABLE name ADD [IF NOT EXISTS] PARTITION (partition_spec)

[location_spec]

[cache_spec]

6. 删除分区

ALTER TABLE name DROP [IF EXISTS] PARTITION (partition)

7. 修改表属性

ALTER TABLE NAME [PARTITION (partition_spec)]

   SET { FILEFORMAT file_format

| ROW FORMAT row_format

| LOCATION ‘hdfs_path_of_directory’

| TABLEPROPERTIES (table_properties)}

3.4.3  数据加载 1. 概述

使用SQL可以向已有的表中加载数据。可以从HDFS集群中加载数据。

说明

如果加载数据语句中有关键字OVERWRITE,表示加载的数据会覆盖表中原有的数据,否则加载的数据会追加到表中。

 

语法说明:

LOAD DATA INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

2. 数据加载示例

数据加载示例操作步骤如下:

(1)     在HDFS上创建文件/tmp/employee.txt文件。

(2)     将/tmp/employee.txt文件加载至employees表中,执行如下命令:

LOAD DATA INPATH '/tmp/employee.txt ' OVERWRITE INTO TABLE employees;

(3)     查询employees中的数据,执行如下命令。执行结果如图3-17所示。

select * from employees;

图3-17 执行结果

 

3.4.4  数据查询 1. 概述

使用SQL可以对数据进行查询分析。

语法说明:

[WITH name AS  (select_expression) [,…]]

SELECT

[ALL | DISTINCT]

[STRAIGHT_JOIN]

select_expr, select_expr, ...

  FROM table_reference [, table_reference]

  [[FULL | [LEFT|RIGHT] INNER | [LEFT|RIGHT] OUTER | [LEFT|RIGHT] SEMI | [LEFT|RIGHT] ANTI | CROSS]

JOIN table_reference

[ON join_equality_clauses | USING (col1[, col2..])]…

  [WHERE where_condition]

  [GROUP BY column|expression [, …]]

  [ORDER BY column|expression [ASC|DESC] [NULLS FIRST | NULLS LAST] [,…]]

  [LIMIT expression [offset expression] ]

  [UNION [ALL] select_statement]

语法解释:

·     在Select关键字前指定WITH子句,可以定义一个子查询,在SELECT语句中可以引用这个子查询。示例如图3-18所示。

图3-18 引用子查询示例

 

·     SELECT语句中指定DISTINCT可以去除重复值,指定ALL表示不去重,ALL为默认处理方式,可省略。示例如图3-19、图3-20所示。

图3-19 去重示例一

 

图3-20 去重示例二

 

·     在SELECT语句中使用STRAIGHT_JOIN关键字后,Impala不再直接按照数据统计信息进行优化JOIN顺序,而是按照SQL中JOIN顺序直接执行。如:

Select straight_join * from medium join small join (select * from big where c1 前位数是偶:舍,5->前位数是奇:进)

DOUBLE

dround(DOUBLE a, INT d)

四舍五入法,保留d位小数

DOUBLE

floor(DOUBLE a)

向下取整,数轴上最接近a的左边整数值 如:6.10->6,-3.4->-4

BIGINT

ceil(DOUBLE a), ceiling(DOUBLE a)

求不小于给定实数的最小整数,如:ceil(6)=6,ceil(6.1)= ceil(6.9) = 7

BIGINT

rand(), rand(INT seed)

返回一个DOUBLE型随机数

其中:seed是生成随机数的随机种子

DOUBLE

exp(DOUBLE a), exp(DECIMAL a)

返回e的a幂次方,a可为小数

DOUBLE

ln(DOUBLE a), ln(DECIMAL a)

以自然数为底的对数,a可为小数

DOUBLE

log10(DOUBLE a), log10(DECIMAL a)

以10为底的对数,a可为小数

DOUBLE

log2(DOUBLE a), log2(DECIMAL a)

以2为底数的对数,a可为小数

DOUBLE

log(DOUBLE base, DOUBLE a)

log(DECIMAL base, DECIMAL a)

以base为底a的对数,base 与 a都是DOUBLE类型

DOUBLE

pow(DOUBLE a, DOUBLE p), power(DOUBLE a, DOUBLE p)

计算a的p次幂

DOUBLE

sqrt(DOUBLE a), sqrt(DECIMAL a)

计算a的平方根

DOUBLE

bin(BIGINT a)

计算a的二进制,结果转为string类型

STRING

hex(BIGINT a) hex(STRING a) hex(BINARY a)

计算a的16进制,结果转为STRING类型

STRING

unhex(STRING a)

hex的逆方法

BINARY

conv(BIGINT num, INT from_base, INT to_base), conv(STRING num, INT from_base, INT to_base)

将GIGINT/STRING类型的num从from_base进制转换成to_base进制

STRING

abs(DOUBLE a)

计算a的绝对值

DOUBLE

pmod(INT a, INT b), pmod(DOUBLE a, DOUBLE b)

a对b取模

INT or DOUBLE

sin(DOUBLE a), sin(DECIMAL a)

求a的正弦值

DOUBLE

asin(DOUBLE a), asin(DECIMAL a)

求a的反正弦值

DOUBLE

cos(DOUBLE a), cos(DECIMAL a)

求余弦值

DOUBLE

acos(DOUBLE a), acos(DECIMAL a)

求反余弦值

DOUBLE

tan(DOUBLE a), tan(DECIMAL a)

求正切值

DOUBLE

atan(DOUBLE a), atan(DECIMAL a)

求反正切值

DOUBLE

degrees(DOUBLE a), degrees(DECIMAL a)

将弧度值转换成角度值

DOUBLE

radians(DOUBLE a), radians(DOUBLE a)

将角度值转换成弧度值

DOUBLE

positive(INT a), positive(DOUBLE a)

返回a

INT or DOUBLE

negative(INT a), negative(DOUBLE a)

返回a的相反数

INT or DOUBLE

sign(DOUBLE a), sign(DECIMAL a)

如果a是正数则返回1.0,是负数则返回-1.0,否则返回0.0

DOUBLE or INT

e()

数学常数e

DOUBLE

pi()

数学常数pi

DOUBLE

factorial(INT a)

求a的阶乘

BIGINT

shiftleft(TINYINT|SMALLINT|INT a, INT b)

shiftleft(BIGINT a, INT b)

按位左移

INT BIGINT

shiftright(TINYINT|SMALLINT|INT a, INTb)

shiftright(BIGINT a, INT b)

按拉右移

INT

BIGINT

shiftrightunsigned(TINYINT|SMALLINT|INTa, INT b),

shiftrightunsigned(BIGINT a, INT b)

无符号按位右移

INT

BIGINT

greatest(T v1, T v2, ...)

求最大值

T

least(T v1, T v2, ...)

求最小值

T

 

表3-7 集合函数

Name(Signature)

Description

Return Type

size(Map)

求map的长度

int

size(Array)

求数组的长度

int

map_keys(Map)

返回map中的所有key

array

map_values(Map)

返回map中的所有value

array

array_contains(Array, value)

如该数组Array包含value返回true,否则返回false

boolean

sort_array(Array)

按自然顺序对数组进行排序并返回

array

 

表3-8 类型转换函数

Name(Signature)

Description

Return Type

typeof(type value)

返回与表达式相对应的数据类型的名称

string

cast(expr as )

将expr转换成type类型 如:cast("1" as BIGINT) 将字符串1转换成了BIGINT类型,如果转换失败将返回NULL

Expected "=" to follow "type"

 

表3-9 日期函数

Name(Signature)

Description

Return Type

from_unixtime(bigint unixtime[, string format])

将时间的秒值转换成format格式(format可为“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh”,“yyyy-MM-dd hh:mm”等等),如from_unixtime(1250111000,"yyyy-MM-dd") 得到2009-03-12

string

unix_timestamp()

获取本地时区下的时间戳

bigint

unix_timestamp(string date)

将格式为yyyy-MM-dd HH:mm:ss的时间字符串转换成时间戳,如unix_timestamp('2009-03-20 11:30:01') = 1237573801

bigint

unix_timestamp(string date, string pattern)

将指定时间字符串格式字符串转换成Unix时间戳,如果格式不对返回0,如:unix_timestamp('2009-03-20', 'yyyy-MM-dd') = 1237532400

bigint

to_date(timestamp)

返回时间字符串的日期部分

string

year(string date)

返回时间字符串的年份部分

int

quarter(date/timestamp/string)

返回当前时间属于哪个季度,如quarter('2015-04-08') = 2

int

month(string date)

返回时间字符串的月份部分

int

day(string date) dayofmonth(date)

返回时间字符串的天

int

hour(string date)

返回时间字符串的小时

int

minute(string date)

返回时间字符串的分钟

int

second(string date)

返回时间字符串的秒

int

weekofyear(timestamp date)

返回时间字符串位于一年中的第几个周内 如weekofyear("1970-11-01 00:00:00") = 44, weekofyear("1970-11-01") = 44

int

datediff(string enddate, string startdate)

计算开始时间startdate到结束时间enddate相差的天数

int

date_add(string startdate, int days)

从开始时间startdate加上days

string

date_sub(string startdate, int days)

从开始时间startdate减去days

string

from_utc_timestamp(timestamp, string timezone)

如果给定的时间戳并非UTC,则将其转化成指定的时区下时间戳

timestamp

to_utc_timestamp(timestamp, string timezone)

如果给定的时间戳是指定时区下时间戳,则将其转化成UTC下的时间戳

timestamp

current_date ()

返回当前时间日期

date

current_timestamp ()

返回当前时间戳

timestamp

add_months(string start_date, int num_months)

返回当前时间下再增加num_months个月的日期

string

last_day(string date)

返回这个月的最后一天的日期,忽略时分秒部分(HH:mm:ss)

string

next_day(string start_date, string day_of_week)

返回当前时间的下一个星期X所对应的日期,如:next_day('2015-01-14','TU') = 2015-01-20 以2015-01-14为开始时间,其下一个星期二所对应的日期为2015-01-20

string

trunc(string date, string format)

返回时间的最开始年份或月份,如trunc("2016-06-26",“MM”)=2016-06-01 trunc("2016-06-26",“YY”)=2016-01-01,注意所支持的格式为MONTH/MON/MM, YEAR/YYYY/YY

string

months_between(date1, date2)

返回date1与date2之间相差的月份,如date1>date2,则返回正,如果date10 THEN 5 WHEN 4>0 THEN 4 ELSE 0 END 将返回5;CASE WHEN 5 (

                                       >     inv_item_sk               int               ,

                                       >     inv_warehouse_sk          int               ,

                                       >     inv_quantity_on_hand      int

                                       > ) partitioned by (inv_date_sk     int );

返回结果:

Query: create table inventory_par

(

    inv_item_sk               int               ,

    inv_warehouse_sk          int               ,

    inv_quantity_on_hand      int

) partitioned by (inv_date_sk     int )

+-------------------------+

| summary                 |

+-------------------------+

| Table has been created. |

+-------------------------+

Fetched 1 row(s) in 7.45s

·     命令示例:

[diaoshare1.hde.com:21000] tpcds10Gtext> insert into inventory_par partition (inv_date_sk) select inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand, inv_date_sk from inventory;

Query: insert into inventory_par partition (inv_date_sk) select inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand, inv_date_sk from inventory

返回结果:

Query submitted at: 2020-05-20 16:25:43 (Coordinator: http://diaoshare1.hde.com:25000)

Query progress can be monitored at: http://diaoshare1.hde.com:25000/query_plan?query_id=f14afb643a275095:8be788d700000000

Modified 13311000 row(s) in 21.92s

·     命令示例:

 [diaoshare1.hde.com:21000] tpcds10Gtext> compute stats inventory_par;

返回结果:

Query: compute stats inventory_par

+------------------------------------------+

| summary                                  |

+------------------------------------------+

| Updated 27 partition(s) and 3 column(s). |

+------------------------------------------+

Fetched 1 row(s) in 21.09s

·     命令示例:

 [diaoshare1.hde.com:21000] tpcds10Gtext> explain select inv_item_sk from inventory_par where inv_date_sk=2450815;

返回结果:

Query: explain select inv_item_sk from inventory_par where inv_date_sk=2450815

+------------------------------------------------------------+

| Explain String                                             |

+------------------------------------------------------------+

| Max Per-Host Resource Reservation: Memory=8.00MB Threads=3 |

| Per-Host Resource Estimates: Memory=34MB                   |

|                                                            |

| PLAN-ROOT SINK                                             |

| |                                                          |

| 01:EXCHANGE [UNPARTITIONED]                                |

| |                                                          |

| 00:SCAN HDFS [tpcds10gtext.inventory_par]                  |

|    partition predicates: inv_date_sk = 2450815             |

|    partitions=1/27 files=1 size=5.77MB                     |

|    row-size=4B cardinality=510.00K                         |

+------------------------------------------------------------+

Fetched 11 row(s) in 0.15s

注意

如果视图的基表是一张分区表,那么分区修剪依据的唯一条件就是该视图定义的原始语句本身。Impala不会对视图查询指定的条件进行进一步的分区修剪操作。

 

3.6.4  分区键列

一般情况下,选择最频繁使用的,能够对大量数据进行过滤的列作为分区列。我们最经常使用的分区列包括和日期时间相关的年月日等,另外区域的物理位置也可以作为分区列使用。

·     对于基于时间的数据,我们需要将需要使用的、作为分区键的部分单独抽取出来。因为Impala不能基于timestamp列分区。

·     分区列的数据类型对真正存储在HDFS上的数据文件的大小影响不大。因为分区列的值不是真正的存储到数据文件中,而是以字符串的形式作为HDFS数据目录名称的一部分。

·     我们要时刻谨记Impala查询的是存储在HDFS上的数据。数据文件至少是几十兆或者更大,对HDFS的IO操作才更有优势。因此我们要尽量避免由于选择的分区键包含太多的值而使每个分区值对应的数据文件个数过多,单个数据文件过小。

3.6.5  使用不同的文件格式

分区表对文件格式的要求具有很大的灵活性,我们甚至可以为不同的分区使用不同的文件格式。例如,我们的表使用纯文本的文件格式,随后我们使用RCFile作为新的文件格式接收数据或者也可以再使用Parquet作为新的文件格式,而所有的数据可以在同一张表中进行查询,前提是使用不同文件格式的数据文件驻留在单独的分区。

对于其他的数据文件类型,我们无法直接使用Impala进行创建。但是我们可以通过在Hive中执行ALTER TABLE、SET FILEFORMAT、INSERT或者LOAD DATA方式将数据加载进特定的数据文件格式中。最后在Impala中使用REFRESH tablename来更新该表的元数据信息,让Impala可以识别到新的数据文件和数据。

·     命令示例:

 [diaoshare1.hde.com:21000] tpcds10Gtext> create table t01(name string) partitioned by (year smallint);

返回结果:

Query: create table t01(name string) partitioned by (year smallint)

+-------------------------+

| summary                 |

+-------------------------+

| Table has been created. |

+-------------------------+

Fetched 1 row(s) in 5.37s

·     命令示例:

[diaoshare1.hde.com:21000] tpcds10Gtext> alter table t01 add partition(year=2012);

返回结果:

Query: alter table t01 add partition(year=2012)

+--------------------------------------------+

| summary                                    |

+--------------------------------------------+

| New partition has been added to the table. |

+--------------------------------------------+

Fetched 1 row(s) in 14.82s

·     命令示例:

[diaoshare1.hde.com:21000] tpcds10Gtext> alter table t01 add partition(year=2013);

返回结果:

Query: alter table t01 add partition(year=2013)

+--------------------------------------------+

| summary                                    |

+--------------------------------------------+

| New partition has been added to the table. |

+--------------------------------------------+

Fetched 1 row(s) in 5.40s

·     命令示例:

[diaoshare1.hde.com:21000] tpcds10Gtext> alter table t01 partition (year=2013) set fileformat parquet;

返回结果:

Query: alter table t01 partition (year=2013) set fileformat parquet

+-------------------------+

| summary                 |

+-------------------------+

| Updated 1 partition(s). |

+-------------------------+

Fetched 1 row(s) in 0.63s

·     命令示例:

[diaoshare1.hde.com:21000] tpcds10Gtext> insert into t01 partition(year=2012) values ('v1'),('v2');

返回结果:

Query: insert into t01 partition(year=2012) values ('v1'),('v2')

Query submitted at: 2020-05-20 17:53:42 (Coordinator: http://diaoshare1.hde.com:25000)

Query progress can be monitored at: http://diaoshare1.hde.com:25000/query_plan?query_id=e4a8da412f7123f:ec9c79d200000000

Modified 2 row(s) in 0.43s

·     命令示例:

[diaoshare1.hde.com:21000] tpcds10Gtext> insert into t01 partition(year=2013) values ('n1'),('n2');

返回结果:

Query: insert into t01 partition(year=2013) values ('n1'),('n2')

Query submitted at: 2020-05-20 17:54:14 (Coordinator: http://diaoshare1.hde.com:25000)

Query progress can be monitored at: http://diaoshare1.hde.com:25000/query_plan?query_id=2240fc4e7f4785ca:1241f3e300000000

Modified 2 row(s) in 0.31s

此时year=2012的HDFS目录包含文本格式的数据文件,而year=2013的HDFS目录包含Parquet数据文件:

·     命令示例:

[hdfs@diaoshare1 root]$ hdfs dfs -du -h /warehouse/tablespace/managed/hive/tpcds10gtext.db/t01/year=2012

返回结果:

SLF4J: Class path contains multiple SLF4J bindings.

6  18  /warehouse/tablespace/managed/hive/tpcds10gtext.db/t01/year=2012/e4a8da412f7123f-ec9c79d200000000_10870849_data.0.

·     命令示例:

 [hdfs@diaoshare1 root]$ hdfs dfs -du -h /warehouse/tablespace/managed/hive/tpcds10gtext.db/t01/year=2013

返回结果:

SLF4J: Class path contains multiple SLF4J bindings.

306  918  /warehouse/tablespace/managed/hive/tpcds10gtext.db/t01/year=2013/2240fc4e7f4785ca-1241f3e300000000_1846961736_data.0.parq

4 最佳实践 4.1  Impala应用实例 4.1.1  设计原则 1. 资源规划

Impala在计算时需要把所有数据读入到内存才能保证交互式分析性能,当内存资源不足时会把数据溢写到磁盘中,会严重降低整个任务的性能。因此在使用Impala前需要考虑单次任务最大需要计算多大数据量,进而推算出Impala集群的节点数和内存大小。

说明

一般情况下Impala节点内存配置越大越好,最低不建议低于64G内存配置。

 

2. 模型设计

在传统应用开发流程中,需要对数据库进行物理设计,这里模型设计与传统数据库上的表设计类似,设计Impala存储模型时需要考虑以下事项:

·     存储方式:未来Impala表使用什么类型的数据文件存储?数据量如果较小,可以使用数据文件的原有格式。如果数据量非常庞大,而且对数据的查询是基于少量列进行的,则强烈建议使用Parquet方式存储。

·     分区方式:针对Impala表进行的频度最高的查询依据什么条件?条件列的区分度如何?如果按条件列来进行分区,单个分区的数据量有多大?需要使用几个分区列?选择合适的分区,能够大大提升查询的效率。

·     内部表&外部表:使用外部表,不需要数据复制的过程,但是不能改变存储的数据文件的格式。使用内部表,在各方面的控制上更为灵活,但是需要将外部的数据复制到Impala内部的处理过程。

·     资源控制:Hadoop的其他类型的作业是否会与Impala的查询并行执行?使用YARN来管理Impala的资源控制,还是Impala使用自身的机制进行管理?

3. 数据加载

如果是现有的HDFS上已经有了相应的数据文件,本步骤可以忽略。

如果现有的Hadoop集群是新建的,仅供Impala使用,那可能需要从外部数据源加载数据。

·     文件加载:如果外部数据源有现成的Impala支持的数据文件,可以通过HDFS文件系统的命令,或者基于WebHDFS和HttpFS的API来编写代码实现。

·     结构化数据加载:如果需要把传统关系数据库中的数据加载到HDFS上,可以通过Sqoop来完成。使用Sqoop将关系型数据库中全量或者增量的数据加载到HDFS上。因Sqoop并不支持所有Impala支持的文件格式,如果我们需要的数据文件格式Sqoop不支持,先转成sqoop支持的格式,再用其他办法转换成impala支持的格式。

·     基于事件的数据加载:对于源端的数据变化必须很快反应到目标数据中的情况,可以考虑使用Flume来实现。Flume具备从控制台、RPC、text、tail、syslog、exec等数据源搜集数据的能力。而且Flume还提供了数据收集和传输的高可用性。

4. 数据处理

利用Impala提供的强大的SQL功能,根据应用不同的需求对数据进行查询处理。

5. 数据返回

处理完成的数据,可以通过JDBC接口来调用,比如可以给BI工具做报表来展现使用。另外也可以将处理结果返回到传统关系型数据库供用户使用。

4.2  Impala性能优化

性能优化的几个重要术语:

·     分区:这项技术在物理上基于分区的键值将数据分开存放,这样在基于键值列查询时,只需对相应的键值列数据进行操作就可以返回结果。

·     连接查询:连接优化是在SQL级别能够进行的最主要的优化之一。如果从SQL级别能够把查询优化到容许的时间内,就不必进行像改变数据文件格式或者改变硬件配置的其他优化。

·     表统计信息:使用COMPUTE STATS语句搜集表和列统计信息可以帮助Impala自动优化连接查询。

·     控制资源使用:一般情况下,Impala使用的内存越多,查询的性能越好。然后在一个集群中,除了Impala还有其他不同的Hadoop组件,我们要保证所有的组件都能申请到足够的内存资源。

4.2.1  最佳实践

·     为数据选择合适的文件格式。

通常情况下,对于海量数据(每张表或者每个分区至少有几个GB)的存储,Parquet文件格式具有很大的优势,因为它按列存储,单次IO可以请求更多数据,另外它也有很好的压缩算法对二进制文件进行压缩。

·     避免在数据处理过程中产生很多小文件。

使用INSERT…VALUES插入数据会产生单个的小文件,所以对海量数据或者影响性能的关键表我们需要使用INSERT…SELECT在表表之间拷贝数据。

·     合适的分区技术。

若我们有一个包含上千个分区的Parquet表,每个分区的数据都小于1GB,那么我们就要考虑以更大的粒度来分区。只有分区的粒度使数据文件的大小合适,才能充分利用HDFS的IO批处理性能和Impala的分布式查询。

·     使用COMPUTE STATS搜集连接查询中海量数据表和影响性能的关键表的统计信息。

·     最小化向客户端传输结果的开销。

可以使用聚集、过滤、Limit子句、impala-shell指定-B和—output-delimiter选项不对结果集美化输出等技术实现。

·     在实际运行一个查询之前,先使用EXPLAIN查看它的执行计划是否将以高效合理的方式运行。

·     在运行一个查询之后,使用PROFILE命令从底层确认IO,内存消耗,网络带宽占用,CPU使用率等信息是否在我们期望的范围之内。

4.2.2  连接查询优化

·     优化连接最简单的方式就是使用COMPUTE STATS命令搜集所以参与关联表的统计信息,让Impala根据每个表的大小、列的非重复值个数等相关信息自动优化查询。为保证统计信息的准确性,我们需要在对表INSERT、LOAD DATA或者添加分区等操作之后及时执行COMPUTE STATS命令搜集统计信息。

Impala查询优化器根据表的绝对大小和相对大小为连接查询选择不同的关联技术,它提供了两种连接方式:

¡     默认的连接方式是Broadcast连接,当右表比左表小时,它的内容会被发送到所有执行查询的节点上。

¡     另一种连接方式是partitioned连接,它使用大小差不太多的大表关联。使用此种方式关联,为了保证关联操作可以并行执行,每个表的一部分数据都会被发送到不同节点上,最后各节点分别对传送过来的数据并行处理。

具体Impala优化器选择哪种连接方式,完全依赖于通过COMPUTE STATS搜集的表统计信息。为了确认表的连接策略,我们可以对一个特定的查询执行EXPLAIN语句。如果通过基准测试我们可以确认一种连接方式比另一种连接方式效率更高,也可以通过Hint的方式手动指定需要的连接方式。

·     当统计信息不可用时如何关联

如果参与关联的表的统计信息不可用,而且Impala自动选择的连接顺序效率很低,我们可以在SELECT关键字之后使用STRAIGHT_JOIN关键字手动指定连接的顺序。

如果参与关联的某些表的统计信息还是可用的,Impala会根据存在统计信息的表重新生成连接顺序。有统计信息的表会被放置在连接顺序的最左端,并根据表的基数和规模降序排列。而没有统计信息的表被作为空表对待,总是放在连接顺序的最右端。

·     使用STRAIGHT_JOIN覆盖连接顺序

如果关联查询由于统计信息不可用或过期或者数据分布等问题导致效率低下,我们可以通过指定STRAIGHT_JOIN关键字改变连接顺序。使用该关键字后,关联查询将不会使用Impala查询优化器自动生成的连接顺序,而是使用查询中表出现的先后顺序作为关联的顺序。对于手动指定连接顺序的查询,我们可能需要根据情况对连接顺序进行微调,比如有四张表分别为BIG、MEDIUM、SMALL、TINY,那连接顺序可以调整为:BIG、TINY、SMALL、MEDIUM。

如下示例中,表BIG经过过滤实际上产生了一个非常小的结果集,而Impala仍然把它作为最大的表对待放在连接顺序的最左侧。为了改变优化器错误的判断,我们使用STRAIGHT_JOIN改变连接的顺序,把BIG表放到了联机顺序的最右侧:

select straight_join x from medium join small join (select * from big where c1 < 10) as big where medium.id=small.id and small.id=big.id;

4.2.3  使用统计信息

当统计信息可用时,Impala可以依据表中数据的规模、值的分布等信息对复杂查询或者多表查询进行很好的优化。

1. 表统计信息

搜集统计信息有如下方式:

·     在Impala中执行COMPUTE STATS语句,这是最好的搜集统计信息的方式:

¡     使用这个语句将自动对表、分区及列统计信息进行搜集,使用一条语句即可完成。

¡     它不依赖于Hive的配置、元数据配置及持有统计信息的元数据库是否是单独等限制。

¡     可以对已搜集过统计信息的表进行增量搜集。

·     当hive.stats.autogather设置为启用时,在Hive中通过INSERT OVERWRITE语句加载数据。

·     在Hive中使用ANALYZE TABLE语句对整个表或某个分区搜集统计信息。

ANALYZE TABLE tablename [PARTITION(partcol1 [=val1], partcol2 [=val2], …)] COMPUTE STATISTICS [NOSCAN];

2. 列统计信息

Impala查询优化器可以使用元数据库中单独的列统计信息。这项技术对于跨表的连接查询计算连接后返回的数据集的大小非常有效。目前,Impala不能自己创建这些元数据信息,但是在Hive shell中使用ANALYZE TABLE语句可以搜集这些统计信息。

如果我们要检查确认表的列统计信息是否可用,可以使用SHOW COLUMN STATS tablename语句或者使用EXPLAIN语句。

3. 通过ALTER TABLE手动设置统计信息

为表添加了一个分区或者插入了新数据,我们可以使用ALTER TABLE语句只搜集更新的属

性信息,而不是对整个表进行重新搜集:

alter table tablename [PARTITION(partcol1 [=val1], partcol2 [=val2], …)] set tblproperties('numRows'='new_value');

4. 统计信息使用示例

在没有搜集统计信息之前,大多数的数字字段显示的统计信息值为-1,表示未知统计信息。

[diaoshare1.hde.com:21000] tpcds10Gtext> show table stats web_sales;

Query: show table stats web_sales

+-------+--------+--------+--------------+-------------------+--------+-------------------+--------------------------------------------------------------------------------------------+

| #Rows | #Files | Size   | Bytes Cached | Cache Replication | Format | Incremental stats | Location        

|

+-------+--------+--------+--------------+-------------------+--------+-------------------+--------------------------------------------------------------------------------------------+

| -1    | 1      | 1.41GB | NOT CACHED   | NOT CACHED        | TEXT   | false             | hdfs://diaoshare1.hde.com:8020/warehouse/tablespace/managed/hive/tpcds10gtext.db/web_sales |

+-------+--------+--------+--------------+-------------------+--------+-------------------+--------------------------------------------------------------------------------------------+

Fetched 1 row(s) in 0.76s

[diaoshare1.hde.com:21000] tpcds10Gtext> show column stats web_sales;

Query: show column stats web_sales

+--------------------------+--------------+------------------+--------+----------+----------+

| Column                   | Type         | #Distinct Values | #Nulls | Max Size | Avg Size |

+--------------------------+--------------+------------------+--------+----------+----------+

| ws_sold_date_sk          | INT          | -1               | -1     | 4        | 4        |

| ws_sold_time_sk          | INT          | -1               | -1     | 4        | 4        |

| ws_ship_date_sk          | INT          | -1               | -1     | 4        | 4        |

| ws_item_sk               | INT          | -1               | -1     | 4        | 4        |

| ws_bill_customer_sk      | INT          | -1               | -1     | 4        | 4        |

| ws_bill_cdemo_sk         | INT          | -1               | -1     | 4        | 4        |

| ws_bill_hdemo_sk         | INT          | -1               | -1     | 4        | 4        |

| ws_bill_addr_sk          | INT          | -1               | -1     | 4        | 4        |

| ws_ship_customer_sk      | INT          | -1               | -1     | 4        | 4        |

| ws_ship_cdemo_sk         | INT          | -1               | -1     | 4        | 4        |

| ws_ship_hdemo_sk         | INT          | -1               | -1     | 4        | 4        |

| ws_ship_addr_sk          | INT          | -1               | -1     | 4        | 4        |

| ws_web_page_sk           | INT          | -1               | -1     | 4        | 4        |

| ws_web_site_sk           | INT          | -1               | -1     | 4        | 4        |

| ws_ship_mode_sk          | INT          | -1               | -1     | 4        | 4        |

| ws_warehouse_sk          | INT          | -1               | -1     | 4        | 4        |

| ws_promo_sk              | INT          | -1               | -1     | 4        | 4        |

| ws_order_number          | INT          | -1               | -1     | 4        | 4        |

| ws_quantity              | INT          | -1               | -1     | 4        | 4        |

| ws_wholesale_cost        | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_list_price            | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_sales_price           | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_ext_discount_amt      | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_ext_sales_price       | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_ext_wholesale_cost    | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_ext_list_price        | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_ext_tax               | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_coupon_amt            | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_ext_ship_cost         | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_net_paid              | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_net_paid_inc_tax      | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_net_paid_inc_ship     | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_net_paid_inc_ship_tax | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

| ws_net_profit            | DECIMAL(7,2) | -1               | -1     | 4        | 4        |

+--------------------------+--------------+------------------+--------+----------+----------+

Fetched 34 row(s) in 0.27s

下面使用impala的COMPUTE STATS可以搜集所有列的统计信息,因为它对整个表进行读操作,可以高效地统计出所有列的统计信息。

[diaoshare1.hde.com:21000] tpcds10Gtext> compute stats web_sales;

Query: compute stats web_sales

+------------------------------------------+

| summary                                  |

+------------------------------------------+

| Updated 1 partition(s) and 34 column(s). |

+------------------------------------------+

Fetched 1 row(s) in 41.76s

[diaoshare1.hde.com:21000] tpcds10Gtext> show table stats web_sales;

Query: show table stats web_sales

+---------+--------+--------+--------------+-------------------+--------+-------------------+--------------------------------------------------------------------------------------------+

| #Rows   | #Files | Size   | Bytes Cached | Cache Replication | Format | Incremental stats | Location     

|

+---------+--------+--------+--------------+-------------------+--------+-------------------+--------------------------------------------------------------------------------------------+

| 7197566 | 1      | 1.41GB | NOT CACHED   | NOT CACHED        | TEXT   | false             | hdfs://diaoshare1.hde.com:8020/warehouse/tablespace/managed/hive/tpcds10gtext.db/web_sales |

+---------+--------+--------+--------------+-------------------+--------+-------------------+--------------------------------------------------------------------------------------------+

Fetched 1 row(s) in 0.03s

[diaoshare1.hde.com:21000] tpcds10Gtext> show column stats web_sales;

Query: show column stats web_sales

+--------------------------+--------------+------------------+--------+----------+----------+

| Column                   | Type         | #Distinct Values | #Nulls | Max Size | Avg Size |

+--------------------------+--------------+------------------+--------+----------+----------+

| ws_sold_date_sk          | INT          | 1813             | 1788   | 4        | 4        |

| ws_sold_time_sk          | INT          | 85345            | 1772   | 4        | 4        |

| ws_ship_date_sk          | INT          | 1944             | 1748   | 4        | 4        |

| ws_item_sk               | INT          | 102814           | 0      | 4        | 4        |

| ws_bill_customer_sk      | INT          | 350526           | 1748   | 4        | 4        |

| ws_bill_cdemo_sk         | INT          | 486173           | 1761   | 4        | 4        |

| ws_bill_hdemo_sk         | INT          | 7376             | 1772   | 4        | 4        |

| ws_bill_addr_sk          | INT          | 234011           | 1743   | 4        | 4        |

| ws_ship_customer_sk      | INT          | 351886           | 1777   | 4        | 4        |

| ws_ship_cdemo_sk         | INT          | 523488           | 1791   | 4        | 4        |

| ws_ship_hdemo_sk         | INT          | 7376             | 1774   | 4        | 4        |

| ws_ship_addr_sk          | INT          | 231115           | 1792   | 4        | 4        |

| ws_web_page_sk           | INT          | 199              | 1773   | 4        | 4        |

| ws_web_site_sk           | INT          | 41               | 1822   | 4        | 4        |

| ws_ship_mode_sk          | INT          | 20               | 1757   | 4        | 4        |

| ws_warehouse_sk          | INT          | 10               | 1742   | 4        | 4        |

| ws_promo_sk              | INT          | 492              | 1762   | 4        | 4        |

| ws_order_number          | INT          | 600022           | 0      | 4        | 4        |

| ws_quantity              | INT          | 99               | 1801   | 4        | 4        |

| ws_wholesale_cost        | DECIMAL(7,2) | 10196            | 1725   | 4        | 4        |

| ws_list_price            | DECIMAL(7,2) | 29452            | 1747   | 4        | 4        |

| ws_sales_price           | DECIMAL(7,2) | 28116            | 1749   | 4        | 4        |

| ws_ext_discount_amt      | DECIMAL(7,2) | 655688           | 1797   | 4        | 4        |

| ws_ext_sales_price       | DECIMAL(7,2) | 656347           | 1769   | 4        | 4        |

| ws_ext_wholesale_cost    | DECIMAL(7,2) | 391938           | 1818   | 4        | 4        |

| ws_ext_list_price        | DECIMAL(7,2) | 929612           | 1786   | 4        | 4        |

| ws_ext_tax               | DECIMAL(7,2) | 122430           | 1752   | 4        | 4        |

| ws_coupon_amt            | DECIMAL(7,2) | 401613           | 1830   | 4        | 4        |

| ws_ext_ship_cost         | DECIMAL(7,2) | 400014           | 1829   | 4        | 4        |

| ws_net_paid              | DECIMAL(7,2) | 743745           | 1787   | 4        | 4        |

| ws_net_paid_inc_tax      | DECIMAL(7,2) | 1032948          | 1813   | 4        | 4        |

| ws_net_paid_inc_ship     | DECIMAL(7,2) | 1054434          | 0      | 4        | 4        |

| ws_net_paid_inc_ship_tax | DECIMAL(7,2) | 1444540          | 0      | 4        | 4        |

| ws_net_profit            | DECIMAL(7,2) | 1008154          | 0      | 4        | 4        |

+--------------------------+--------------+------------------+--------+----------+----------+

Fetched 34 row(s) in 0.16s

4.2.4  使用EXPLAIN信息

EXPLAIN语句为我们提供了一个查询执行的逻辑步骤,包括怎样将查询分布到多个节点上,各节点之前怎么交换中间结果以及产生最终结果等。我们可以通过这些信息初步判断查询执行的方式是否高效。

示例:

[impalaa9.hde.com:21000] tpcds_100_parquet> explain select count(*) from customer_address;

Query: explain select count(*) from customer_address

+--------------------------------------------------------------------------------------+

| Explain String                                                                       |

+--------------------------------------------------------------------------------------+

| Max Per-Host Resource Reservation: Memory=128.00KB Threads=3                         |

| Per-Host Resource Estimates: Memory=21MB                                             |

|                                                                                      |

| PLAN-ROOT SINK                                                                       |

| |                                                                                    |

| 03:AGGREGATE [FINALIZE]                                                              |

| |  output: count:merge(*)                                                            |

| |  row-size=8B cardinality=1                                                         |

| |                                                                                    |

| 02:EXCHANGE [UNPARTITIONED]                                                          |

| |                                                                                    |

| 01:AGGREGATE                                                                         |

| |  output: sum_init_zero(tpcds_100_parquet.customer_address.parquet-stats: num_rows) |

| |  row-size=8B cardinality=1                                                         |

| |                                                                                    |

| 00:SCAN HDFS [tpcds_100_parquet.customer_address]                                    |

|    partitions=1/1 files=20 size=1.72GB                                               |

|    row-size=8B cardinality=50.00M                                                    |

+----------------------------------------------------------------------------------

我们应当自底向上读输出结果:

·     最后一部分内容展示了像读取的总数据量等底层的详细信息。通过读取的数据量,我们可以判断分区策略是否有效,并结合集群大小预估读取这些数据需要的时间等。

·     我们可以看到操作是否被impala不同的节点并行执行。

·     我们可以从更高级别看中间结果在不同节点间的流向。

·     通过配置EXPLAIN_LEVEL参数,我们可以了解到更详细的输出信息。我们可以把这个参数由0改为1来确认统计信息是否存在,估算查询要消耗的资源等。

说明

Impala-shell中,执行SET_EXPLAIN_LEVEL=level,这里的level可以是0到3的整数,分别代表minimal,standard,extended和verbose

 

4.2.5  使用PROFILE信息

在impala-shell中,我们使用PROFILE语句可以输出最近执行的查询的更详细更底层的信息。与执行计划不同的是,查询必须执行完成后,才能使用PROFILE输出信息。它包括了执行该查询每个节点读取的物理字节数,使用的最大内存量等信息。通过这些信息,我们可以判断查询是IO消耗型的,CPU消耗型的,网络消耗型的或者受性能低下节点的影响,从而可以检查某些推荐的配置是否生效等,通过EXPLAIN_LEVEL也可以控制通过PROFILE输出的执行计划的详细程度。

示例:

[impalaa9.hde.com:21000] tpcds_100_parquet> profile;

Query Runtime Profile:

Query (id=f46f595c72f29a0:c2c4c4f800000000):

  Summary:

    Session ID: af470dc218fe53fd:c48ac8e35b2271b3

    Session Type: BEESWAX

    Start Time: 2020-05-19 19:00:14.263186000

    End Time: 2020-05-19 19:00:19.354988000

    Query Type: EXPLAIN

    Query State: FINISHED

    Query Status: OK

    Impala Version: impalad version 3.2.0-SNAPSHOT RELEASE (build bd9ca1df0108ac8526e3ee6d73353f9afe08c6e1)

    User: impala

    Connected User: impala

    Delegated User:

    Network Address: ::ffff:101.12.25.158:38212

    Default Db: tpcds_100_parquet

    Sql Statement: explain select count(*) from customer_address

    Coordinator: impalaa9.hde.com:22000

    Query Options (set by configuration): CLIENT_IDENTIFIER=Impala Shell v3.2.0-SNAPSHOT (bd9ca1d) built on Tue Mar 17 23:52:56 CST 2020

    Query Options (set by configuration and planner): MT_DOP=0,CLIENT_IDENTIFIER=Impala Shell v3.2.0-SNAPSHOT (bd9ca1d) built on Tue Mar 17 23:52:56 CST 2020

    Query Compilation: 5s084ms

       - Metadata load started: 16.254ms (16.254ms)

       - Metadata load finished. loaded-tables=1/1 load-requests=1 catalog-updates=4: 4s674ms (4s657ms)

       - Analysis finished: 4s818ms (144.109ms)

       - Value transfer graph computed: 4s855ms (37.268ms)

       - Single node plan created: 4s959ms (103.718ms)

       - Runtime filters computed: 4s966ms (7.599ms)

       - Distributed plan created: 4s966ms (241.606us)

       - Planning finished: 5s084ms (117.290ms)

    Query Timeline: 5s092ms

       - Query submitted: 79.242us (79.242us)

       - Planning finished: 5s087ms (5s087ms)

       - Rows available: 5s087ms (330.954us)

       - First row fetched: 5s088ms (1.138ms)

       - Unregister query: 5s091ms (3.121ms)

    Frontend:

  ImpalaServer:

     - ClientFetchWaitTimer: 4.218ms

     - RowMaterializationTimer: 0.000ns

 

5 常见问题解答 5.1  运维类问题 1. Impala对char类型支持度不高,不建议使用,如果使用的话,在执行SQL的时候需用cast对其类型转换下,否则查询匹配不到

·     问题描述:Impala对char类型支持度不高,不建议使用,如果使用的话,在执行SQL的时候需用cast对其类型转换下,否则查询匹配不到。

·     原因分析:Impala对char类型支持度不高。

·     处理步骤:进行cast转换,示例:where (t_meal_time = cast('breakfast' as char(20))。

2. 针对物理机,卸载重装大数据平台的3节点独立集群,开启kerberos,选择全部组件,部署Impala组件时失败,导致集群部署失败。

·     问题描述:针对物理机,卸载重装大数据平台的3节点独立集群,开启kerberos,选择全部组件,部署Impala组件时失败,导致集群部署失败。

·     原因分析:集群部署时,安装软件时包损坏,或者包冲突。

·     处理步骤:删除损坏包或冲突包,示例:yum erase openssl-devel –y。

3. Impala中执行describe table命令后,大量小文件导致内存溢出

·     问题现象:Impala存储大量小文件时执行describe table命令后,内存溢出报错。

·     问题产生条件:在Impala表存在过多小文件时,执行describe命令会对表的HDFS元数据进行统计,并下发rest请求,此时文件过多返回数据量过大,导致内存溢出。

·     规避措施:Impala原生问题,建议避免表中小文件过多,总文件数不得多于200w。

4. Impala中对表进行load操作时,无法通过[集群权限/角色管理]对路径的访问权限进行授权

·     问题现象:对表进行load操作时,报:Impala does not have READ permissions on this file。

·     问题产生条件:开启角色管理的集群中,对表进行load操作时,需要impala用户对路径有访问权限。

·     规避措施:通过[集群权限/角色管理]无法为impala用户赋予所需权限,需要通过hadoop的acl命令,为impala用户赋予权限:hadoop fs -setfacl -R -m user:impala:rwx /d1。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3